# Copyright (C) 2025 武汉凹语言科技有限公司
# SPDX-License-Identifier: AGPL-3.0-or-later

# 兼容 QEMU virt 机器的 串口 和 关机 设备地址
常量 $串口 = 0x10000000
常量 $关机 = 0x100000

# 用于输出的字符串
全局 $信札 = "你好, 睿斯克发威 裸金属(RISC-V Baremetal)!\n\x00"

# 主函数
函数 _启动:
%开篇:
    # 参甲格 = 字符串地址
    计加常  参甲格, %相对高位($信札)         # 高20位 = 当前PC + 偏移
    某加常  参甲格, 参甲格, %相对低位(%开篇)  # 低12位

%精卫填海:
    读微正  参乙格, 0(参甲格)   # 取一个字节
    若等转  参乙格, 零格, %收工 # 如果是0则结束

    # 暂甲格 = 串口 地址
    常赋某  暂甲格, %高位($串口)           # 串口 高20位
    某加常  暂甲格, 暂甲格, %低位($串口)   # 串口 低12位

    写微整  参乙格, 0(暂甲格)        # 写到 串口 寄存器
    某加常  参甲格, 参甲格, 1        # 下一个字符
    转常址  零格, %精卫填海

%收工:
    # 写退出码 0 到 关机 寄存器, 退出模拟器
    常赋某  暂甲格, %高位($关机)     # 关机寄存器地址
    某加常  暂甲格, 暂甲格, %低位($关机)

    # 暂乙格 = 0x5555
    常赋某  暂乙格, 0x5             # 高 20 位 (0x5 << 12 = 0x5000)
    某加常  暂乙格, 暂乙格, 0x555   # 结果 = 0x5000 + 0x555 = 0x5555

    写普整  暂乙格, 0(暂甲格)

    # 如果不支持 关机设备，就进入 苦海无边 死循环
%苦海:
    转常址  零格, %苦海
完毕
